package com.zenithmind.coding.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.coding.pojo.dto.SubmissionDTO;
import com.zenithmind.coding.pojo.entity.Submission;
import com.zenithmind.coding.pojo.vo.SubmissionVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 代码提交服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface SubmissionService extends IService<Submission> {

    /**
     * 提交代码
     * 
     * @param submissionDTO 提交DTO
     * @return 提交VO
     */
    SubmissionVO submitCode(SubmissionDTO submissionDTO);

    /**
     * 分页查询提交记录
     * 
     * @param current 当前页
     * @param size 页大小
     * @param userId 用户ID
     * @param problemId 问题ID
     * @param language 编程语言
     * @param status 提交状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页结果
     */
    PageResult<SubmissionVO> getSubmissionPage(Long current, Long size, String userId,
                                              String problemId, String language, Integer status,
                                              LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID查询提交详情
     * 
     * @param id 提交ID
     * @return 提交VO
     */
    SubmissionVO getSubmissionById(String id);

    /**
     * 重新评判
     * 
     * @param id 提交ID
     * @return 是否成功
     */
    Boolean rejudgeSubmission(String id);

    /**
     * 获取用户最佳提交
     * 
     * @param userId 用户ID
     * @param problemId 问题ID
     * @return 提交VO
     */
    SubmissionVO getUserBestSubmission(String userId, String problemId);

    /**
     * 获取问题最佳提交
     * 
     * @param problemId 问题ID
     * @param limit 限制数量
     * @return 提交列表
     */
    List<SubmissionVO> getProblemBestSubmissions(String problemId, Integer limit);

    /**
     * 获取最近提交
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 提交列表
     */
    List<SubmissionVO> getRecentSubmissions(String userId, Integer limit);

    /**
     * 获取优秀提交
     * 
     * @param problemId 问题ID
     * @param language 编程语言
     * @param limit 限制数量
     * @return 提交列表
     */
    List<SubmissionVO> getExcellentSubmissions(String problemId, String language, Integer limit);

    /**
     * 分享提交
     * 
     * @param id 提交ID
     * @return 是否成功
     */
    Boolean shareSubmission(String id);

    /**
     * 取消分享提交
     * 
     * @param id 提交ID
     * @return 是否成功
     */
    Boolean unshareSubmission(String id);

    /**
     * 获取用户提交统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    Object getUserSubmissionStatistics(String userId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取语言统计
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 语言统计列表
     */
    List<Object> getLanguageStatistics(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取提交趋势
     * 
     * @param days 天数
     * @return 趋势数据
     */
    List<Object> getSubmissionTrend(Integer days);

    /**
     * 检测代码抄袭
     * 
     * @param id 提交ID
     * @return 检测结果
     */
    Object checkPlagiarism(String id);

    /**
     * 获取相似提交
     *
     * @param id 提交ID
     * @param threshold 相似度阈值
     * @param limit 限制数量
     * @return 相似提交列表
     */
    List<SubmissionVO> getSimilarSubmissions(String id, Double threshold, Integer limit);

    /**
     * 导出提交记录
     *
     * @param userId 用户ID
     * @param problemId 问题ID
     * @param language 编程语言
     * @param status 提交状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 下载链接
     */
    String exportSubmissions(String userId, String problemId, String language, Integer status,
                           java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);
}
